﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Quaack.Data;

namespace Quaack.Web.Controls
{
    public partial class CombinedContentHolder : System.Web.UI.UserControl
    {
        public Bericht Bericht { get; set; }
        public List<Bericht> Reacties
        {
            get
            {
                if (_reacties != null)
                    return _reacties;

                if (Bericht != null)
                {
                    _reacties = Bericht.Reacties ?? new List<Bericht>();
                }

                return _reacties ?? new List<Bericht>();


            }
            private set { _reacties = value; }
        }

        public Profiel Profiel { get; set; }

        public ButtonHolder ContentButtonLeft;
        public ButtonHolder ContentButtonRight;
        public ButtonHolder UserIdButton;
        private List<Bericht> _reacties;



        public TextBox Content { get { return ContentHolder.Content; } }
        public ImageButton Avatar { get { return this.UserId.UserAvatar; } }
        public Label UserName { get { return this.UserId.UserName; } }
        public bool ShowContent { get { return ContentHolder.Visible; } set { ContentHolder.Visible = value; } }


        protected void Page_Load(object sender, EventArgs e)
        {
            ContentButtonLeft = new ButtonHolder(this.ContentHolder.LeftButton);
            ContentButtonRight = new ButtonHolder(this.ContentHolder.RightButton);
            UserIdButton = new ButtonHolder(this.UserId.UserButton);

            ContentButtonLeft.ButtonClicked += ButtonClicked;
            ContentButtonRight.ButtonClicked += ButtonClicked;
            UserIdButton.ButtonClicked += ButtonClicked;
            Avatar.Click += AvatarClicked;


            UserIdButton.Type = ButtonType.Undefined;
            ContentButtonLeft.Type = ButtonType.Undefined;
            ContentButtonRight.Type = ButtonType.Undefined;


            if (Bericht != null && Profiel == null)
            {
                Profiel = Bericht.Eigenaar;
            }


            if (Profiel != null)
            {
                SetProfile();
                SetContent();


                SetProfileButton();
                SetContentButtons();
            }


        }


        private void AvatarClicked(object sender, ImageClickEventArgs e)
        {
            NavigeerNaarGebruikerPagina();
        }

        private void ButtonClicked(object sender, EventArgs eventArgs)
        {
            ButtonHolder button = sender as ButtonHolder;

            if (button != null)
                switch (button.Type)
                {
                    //RemoveProfile = 1,
                    case ButtonType.RemoveProfile:
                        {
                            VerwijderProfiel();
                            break;
                        }

                    //RemoveMessage = 2,
                    case ButtonType.RemoveMessage:
                        {
                            VerwijderBericht();
                            break;
                        }

                    //RemoveUser = 3,
                    case ButtonType.RemoveUser:
                        {
                            VerwijderProfiel();
                            break;
                        }


                    //EditMessage = 4,
                    case ButtonType.EditMessage:
                        {
                            BewerkBericht();
                            break;
                        }

                    //EditProfile = 5,
                    case ButtonType.EditProfile:
                        {
                            BewerkProfiel();
                            break;
                        }

                    //BlockUser = 6,
                    case ButtonType.BlockUser:
                        {
                            BlokkerGebruiker();
                            break;
                        }

                    //DeBlockUser = 7,
                    case ButtonType.DeBlockUser:
                        {
                            DeblokkerGebruiker();
                            break;
                        }

                    //PostNewMessage = 8,
                    case ButtonType.PostNewMessage:
                        {
                            NieuwBericht();
                            break;
                        }

                    //PostResponseMessage = 9,
                    case ButtonType.PostResponseMessage:
                        {
                            ReageerOpBericht();
                            break;
                        }

                    //NavigateHome = 10
                    case ButtonType.NavigateHome:
                        {
                            NavigeerNaarHome();
                            break;
                        }
                    //SaveMessage = 11
                    case ButtonType.SaveMessage:
                        {
                            SaveBericht();
                            break;
                        }
                    //CancelMessage = 12
                    case ButtonType.CancelMessage:
                        {
                            CancelBericht();
                            break;
                        }

                    case ButtonType.BlockProfile:
                        {
                            BlockProfile();
                            break;
                        }

                    case ButtonType.DeblockProfile:
                        {
                            DeblockProfile();
                            break;
                        }

                    default:
                        {
                            // do nothing
                            break;
                        }
                }
        }

        void SetProfile()
        {
            UserName.Text = Profiel.Gebruikersnaam;
            Avatar.ImageUrl = Profiel.AvatarLocatie;
        }

        void SetProfileButton()
        {
            if (Page.User.Identity.IsAuthenticated)
            {
                // is dit het profiel van de huidige gebruiker?
                if (Profiel.Id == Provider.CurrentUser.Id)
                {
                    UserIdButton.Type = ButtonType.NavigateHome;

                    // Is dit de Homepage van de huidige gebruiker?
                    if (Provider.IsHomePage)
                        UserIdButton.Type = ButtonType.PostNewMessage;

                    if (Bericht != null)
                        UserIdButton.Type = ButtonType.EditMessage;
                }
                else
                {
                    //  Andere gebruiker
                    if (Provider.CurrentUser.GeblokkeerdeGebruikers.Any(i => i.Id == Profiel.Id))
                        UserIdButton.Type = ButtonType.DeBlockUser;

                    else
                        UserIdButton.Type = ButtonType.BlockUser;
                }
            }
        }

        void SetContent()
        {
            if (Bericht != null)
            {
                Content.Text = Bericht.Tekst;

                Reacties = Bericht.Reacties;
            }

            else
            {
                Content.Text = String.Format("E-mail : {0} \n" +
                                                              "Telefoon : {1} \n" +
                                                              "Profiel : {2}", Profiel.Emailadres, Profiel.Mobiel ?? "Onbekend", Profiel.Profielschets ?? "Onbekend");
            }

            Content.Enabled = false;
        }

        void SetContentButtons()
        {
            if (Page.User.Identity.IsAuthenticated)
            {
                if (Bericht != null)
                {
                    // Toon Bericht knoppen
                    if (Provider.CurrentUser.Id == Provider.CurrentUserPage.Id)
                        ContentButtonLeft.Type = ButtonType.RemoveMessage;

                    if (Profiel.GeblokkeerdeGebruikers.All(i => i.Id != Provider.CurrentUser.Id))
                        ContentButtonRight.Type = ButtonType.PostResponseMessage;

                    if( Page.User.IsInRole("admin"))
                    {
                        ContentButtonRight.Type = ButtonType.PostResponseMessage;
                        ContentButtonLeft.Type = ButtonType.RemoveMessage;
                    } 

                }
                else
                {
                    // Toon Profiel knoppen
                    if (Provider.CurrentUser != null && Provider.CurrentUser.Id == Profiel.Id)
                    {
                        ContentButtonLeft.Type = ButtonType.RemoveProfile;
                        ContentButtonRight.Type = ButtonType.EditProfile;
                    }
                    else if (Page.User.IsInRole("admin"))
                    {
                        if (Profiel.IsVerwijderd)
                        {
                            // Profiel is verwijderd, geen acties mogelijk
                        }
                        else if (Profiel.IsGeblokkeerd) 
                        {
                            ContentButtonLeft.Type = ButtonType.DeblockProfile;
                            ContentButtonRight.Type = ButtonType.RemoveProfile;
                        }
                        else
                        {
                            ContentButtonLeft.Type = ButtonType.BlockProfile;
                        }
                    }
                }

                if (ContentHolder.EditType != MessageType.Undefined)
                {
                    ContentButtonLeft.Type = ButtonType.CancelMessage;
                    ContentButtonRight.Type = ButtonType.SaveMessage;
                }
            }
        }

        protected void VerwijderBericht()
        {
            // OK
            Bericht.Verwijder(Provider.CurrentUser);
            Response.Redirect(Request.RawUrl);
        }

        protected void BlokkerGebruiker()
        {
            // OK
            Provider.CurrentUser.BlokkeerGebruiker(Profiel);
            // Mail sturen
            Provider.SendMail(Profiel.Emailadres, "Je bent geblokkeerd door " + Provider.CurrentUser.Gebruikersnaam, string.Format(
                @"<p>Beste {0},</p>
                  <p>{1} heeft je geblokkeerd. Dit betekend dat je geen reacties meer kan plaatsen op de pagina van {1}.</p>
                  <p>Met vriendelijke groet,</p>
                  <p>Quaack</p>", Profiel.Gebruikersnaam, Provider.CurrentUser.Gebruikersnaam
            ));
            Response.Redirect(Request.RawUrl);

        }

        protected void DeblokkerGebruiker()
        {
            // OK
            Provider.CurrentUser.DeblokkeerGebruiker(Profiel);
            // Mail sturen
            Provider.SendMail(Profiel.Emailadres, "Je bent gedeblokkeerd door " + Provider.CurrentUser.Gebruikersnaam, string.Format(
                @"<p>Beste {0},</p>
                  <p>{1} heeft je gedeblokkeerd. Dit betekend dat je weer reacties kan plaatsen op de pagina van {1}.</p>
                  <p>Met vriendelijke groet,</p>
                  <p>Quaack</p>", Profiel.Gebruikersnaam, Provider.CurrentUser.Gebruikersnaam
            ));
            Response.Redirect(Request.RawUrl);

        }

        protected void NavigeerNaarHome()
        {
            // OK
            Response.Redirect("GebruikerHome.aspx?profiel=" + Profiel.Id);
        }

        protected void NavigeerNaarGebruikerPagina()
        {
            // OK
            Response.Redirect("GebruikerHome.aspx?profiel=" + Profiel.Id);
        }

        protected void NieuwBericht()
        {
            EnableEdit(MessageType.NewMessage);
            this.SetContentButtons();
        }

        protected void BewerkProfiel()
        {
            Response.Redirect("WijzigProfiel.aspx");
        }

        protected void VerwijderProfiel()
        {
            if (Profiel.Id == Provider.CurrentUser.Id)
            {
                // Jezelf verwijderen
                Response.Redirect("Uitschrijven.aspx");
            }
            else
            {
                // Admin-actie 
                Profiel.Verwijder();
            }
        }

        protected void BewerkBericht()
        {
            EnableEdit(MessageType.Edit);
            this.SetContentButtons();
        }

        protected void ReageerOpBericht()
        {
            EnableEdit(MessageType.NewReaction);
            this.SetContentButtons();
        }

        protected void BlockProfile()
        {
            Profiel.Blokkeer();
            // Mail sturen
            Provider.SendMail(Profiel.Emailadres, "Je bent geblokkeerd door een administrator", string.Format(
                @"<p>Beste {0},</p>
                  <p>Een administrator heeft je geblokkeerd. Dit betekend dat je niet meer kan inloggen.</p>
                  <p>Met vriendelijke groet,</p>
                  <p>Quaack</p>", Profiel.Gebruikersnaam
            ));
            Response.Redirect(Request.RawUrl);
        }

        protected void DeblockProfile()
        {
            Profiel.Deblokkeer();
            // Mail sturen
            Provider.SendMail(Profiel.Emailadres, "Je bent gedeblokkeerd door een administrator", string.Format(
                @"<p>Beste {0},</p>
                  <p>Een administrator heeft je gedeblokkeerd. Dit betekend dat je weer kan inloggen.</p>
                  <p>Met vriendelijke groet,</p>
                  <p>Quaack</p>", Profiel.Gebruikersnaam
            ));
            Response.Redirect(Request.RawUrl);
        }

        protected void SaveBericht()
        {
            switch (ContentHolder.EditType)
            {
                case MessageType.NewMessage:
                    {
                        var msg = new Bericht(Provider.CurrentUser, ContentHolder.Message.Text);
                        break;
                    }
                case MessageType.NewReaction:
                    {
                        Bericht.Reageer(Provider.CurrentUser, ContentHolder.Message.Text);
                        break;
                    }
                case MessageType.Edit:
                    {
                        Bericht.Update(ContentHolder.Content.Text);
                        break;
                    }
                default:
                    {

                        break;
                    }


            }


            DisableEdit();
            Response.Redirect(Request.RawUrl);
        }

        protected void CancelBericht()
        {
            DisableEdit();
            Response.Redirect(Request.RawUrl);
        }

        protected void EnableEdit(MessageType type)
        {
            this.ContentHolder.EnableEdit(type);
            MyPanel.CssClass = "combined-content-holder editing";
        }

        protected void DisableEdit()
        {
            this.ContentHolder.DisableEdit();
            MyPanel.CssClass = "combined-content-holder";
        }
    }
}